// 2025/07/26
// Author: Forever
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100010; // 根据题目要求调整大小

int n, m, d[MAXN * 4];
bool b[MAXN * 4];
string a;

void push_down(int s, int t, int p)
{
    if (b[p] == 0)
        return;
    int m = s + ((t - s) >> 1);
    d[p << 1] = (m - s + 1) - d[p << 1];
    b[p << 1] = !b[p << 1];
    d[(p << 1) | 1] = (t - m) - d[(p << 1) | 1];
    b[(p << 1) | 1] = !b[(p << 1) | 1];
    b[p] = 0;
}

void build(int l, int r, int p)
{
    if (l == r) {
        d[p] = a[l] - '0';
        return;
    }
    int m = l + ((r - l) >> 1);
    build(l, m, p << 1);
    build(m + 1, r, (p << 1) | 1);
    d[p] = d[p << 1] + d[(p << 1) | 1];
}

void update(int l, int r, int s, int t, int p)
{
    if (l <= s && t <= r) {
        d[p] = (t - s + 1) - d[p];
        b[p] = !b[p];
        return;
    }
    push_down(s, t, p);
    int m = s + ((t - s) >> 1);
    if (l <= m)
        update(l, r, s, m, p << 1);
    if (r > m)
        update(l, r, m + 1, t, (p << 1) | 1);
    d[p] = d[p << 1] + d[(p << 1) | 1];
}

int getsum(int l, int r, int s, int t, int p)
{
    if (l <= s && t <= r)
        return d[p];
    push_down(s, t, p);
    int m = s + ((t - s) >> 1);
    int sum = 0;
    if (l <= m)
        sum = getsum(l, r, s, m, p << 1);
    if (r > m)
        sum += getsum(l, r, m + 1, t, (p << 1) | 1);
    return sum;
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    cin >> a;
    build(0, n - 1, 1);
    for (int i = 0; i < m; ++i) {
        int op, l, r;
        cin >> op >> l >> r;
        --l, --r;
        if (op == 0)
            update(l, r, 0, n - 1, 1);
        else
            cout << getsum(l, r, 0, n - 1, 1) << '\n';
    }
    return 0;
}